/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import ComponenteDatos.AgenciaFacadeLocal;
import ComponenteDatos.EgresosFacadeLocal;
import ComponenteDatos.EncomiendaFacade;
import ComponenteDatos.EncomiendaFacadeLocal;
import ComponenteEntidad.*;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.org.apache.xpath.internal.operations.Bool;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

/**
 *
 * @author Esmeralda
 */
@ManagedBean
@SessionScoped
public class ManagedBeanEncomienda implements Serializable {

    @EJB
    private EncomiendaFacadeLocal encomiendaFacade;
    @EJB
    private AgenciaFacadeLocal AgenciaFacade;
    @EJB
    private EgresosFacadeLocal EgresosFacade;
    private Encomienda ObjetoEmcomienda;
    private Encomienda ObjetoEmcomiendaCrear;
    private Encomienda ObjetoEmcomiendaCrear2;
    private Agencia ObjetoAgencia;
    private Cliente objetoCliente;
    private Tipopago objetoTipoPago;
    private Empleado objetoClieResponsable;
    private Igv objetoIGV;
    private Tipocomprobante objetoTipoCompPago;
    private Viaje ObjetoViaje;
    private List<Encomienda> lista;
    private List<Encomienda> filtrado;
    private List<Encomienda> lista3;
    private List<Encomienda> lista4;
    private List<Agencia> lista5;
    private List<Encomienda> listaencoxentregar;
    private List<SelectItem> objetoItemsAgencia = new LinkedList<SelectItem>();
    private HashMap<Integer, Agencia> myobjeto = new HashMap<Integer, Agencia>();
    private Date fechaactual;
    private Date fecha2;
    private String buscar;
    private String buscapor;
    private int idagenciapdf;
    private int anio1;//Parametro del 1er reporte
    private int anio2;//Parametro del 1er reporte
    private int anio3;//Parametro del 2do reporte
    private Date fechaini;//Parametro del 3er reporte
    private Date fechafin;//Parametro del 3er reporte
    private Egresos objetoEgresosCrear11;

    public ManagedBeanEncomienda() {
        ObjetoEmcomienda = new Encomienda();
        ObjetoEmcomienda.setEncomiendadetalleList(new LinkedList<Encomiendadetalle>());
        ObjetoEmcomiendaCrear = new Encomienda();
        ObjetoEmcomiendaCrear2 = new Encomienda();
        ObjetoAgencia = new Agencia();
        objetoCliente = new Cliente();
        objetoClieResponsable = new Empleado();
        objetoIGV = new Igv();
        objetoTipoCompPago = new Tipocomprobante();
        ObjetoViaje = new Viaje();
        objetoTipoPago = new Tipopago();
        ObjetoEmcomiendaCrear.setEncTotal(BigDecimal.ZERO);
        ObjetoEmcomiendaCrear.setEncPagado(false);
        ObjetoEmcomiendaCrear.setEncDescuento(BigDecimal.ZERO);
        lista = new LinkedList<Encomienda>();
        lista3 = new LinkedList<Encomienda>();
        lista4 = new LinkedList<Encomienda>();
        listaencoxentregar = new LinkedList<Encomienda>();
        lista5 = new LinkedList<Agencia>();
        fechaactual = new Date();
        fechaini = new Date();
        fechafin = new Date();
        fecha2 = new Date();
        buscapor = "destinatario";
        objetoEgresosCrear11 = new Egresos();
        try {
            //Setear Fecha
            java.util.Date hoy = new java.util.Date();
            SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            Date fecha = df.parse(df.format(hoy)); //Date.parse(df.format(hoy));
            ObjetoEmcomiendaCrear.setEncFecha(fecha);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
    }

    public void getMmmpara() {
        // System.out.println("aca si alla no");
    }

    public Egresos getObjetoEgresosCrear11() {
        return objetoEgresosCrear11;
    }

    public void setObjetoEgresosCrear11(Egresos objetoEgresosCrear11) {
        this.objetoEgresosCrear11 = objetoEgresosCrear11;
    }

    public Empleado getObjetoClieResponsable() {
        return objetoClieResponsable;
    }

    public Cliente getObjetoCliente() {
        return objetoCliente;
    }

    public void setObjetoCliente(Cliente objetoCliente) {
        this.objetoCliente = objetoCliente;
    }

    public void setObjetoClieResponsable(Empleado objetoClieResponsable) {
        this.objetoClieResponsable = objetoClieResponsable;
    }

    public Agencia getObjetoAgencia() {
        return ObjetoAgencia;
    }

    public void setObjetoAgencia(Agencia ObjetoAgencia) {
        this.ObjetoAgencia = ObjetoAgencia;
    }

    public Igv getObjetoIGV() {
        return objetoIGV;
    }

    public void setObjetoIGV(Igv objetoIGV) {
        this.objetoIGV = objetoIGV;
    }

    public List<Encomienda> getLista() {
        lista = new LinkedList<Encomienda>();
        List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
        listaTemporal = encomiendaFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getEncEstado() == 1) {
                lista.add(listaTemporal.get(i));
            }
        }
        if (ObjetoEmcomienda.getIdEncomienda() == null) {
            ObjetoEmcomienda = lista.get(lista.size() - 1);
        }

        return lista;
    }

    public List<Encomienda> getLista2(ManagedBeanIniciosesion sesion) throws ParseException {//lista para editar solo las encomiendas diarias y las que aun todavia no salen
        boolean ingresoadmin = false;
        if (sesion.getObjetoEmpleado().getCargo().getCarCargo().equalsIgnoreCase("ADMINISTRADOR")) {
            ingresoadmin = true;
            // System.out.println("ADMIN ");
        } else if (sesion.getObjetoEmpleado().getCargo().getCarCargo().equalsIgnoreCase("VENDEDOR")) {
            ingresoadmin = false;
            // System.out.println("vendedor ");
        }

        // System.out.println("empleado: "+sesion.getObjetoEmpleado().getIdEmpleado());
        lista = new LinkedList<Encomienda>();
        List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
        listaTemporal = encomiendaFacade.findAll();
        Date fechaactual = new Date();
        Date fechaviaje = new Date();
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaactual = df.parse(df.format(fechaactual));
//        // System.out.println("fecha actual: " + fechaactual);
        int hora, minutos, horaminviaje, horaminactual;
        Calendar calendario = new GregorianCalendar();
        hora = calendario.get(Calendar.HOUR_OF_DAY);
        minutos = calendario.get(Calendar.MINUTE);
        horaminactual = hora * 60 + minutos;
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getEncEstado() != 2) {//lista todos menos los cancelados.!! estado = 2
                fechaviaje = df.parse(df.format(listaTemporal.get(i).getViaje().getViaFehaSalida()));
//                // System.out.println("fecha viaje: " + fechaviaje);//FILTRAMOS PARA QUE EL EMPLEADO QUE INICIA SESION -> solo podra ver las encomiendas que registro.(admin puede ver todas)
                if ((fechaviaje.after(fechaactual) || fechaviaje.equals(fechaactual)) && (sesion.getObjetoEmpleado().equals(listaTemporal.get(i).getEmpleado()) || ingresoadmin)) {//muestro los viajes mayores ala fecha actual actual
//                    // System.out.println("fechaviaje mayor o igual al actual");
//                    // System.out.println("dentro empleado."+listaTemporal.get(i).getEmpleado()+" : "+sesion.getObjetoEmpleado());
                    horaminviaje = Integer.parseInt(listaTemporal.get(i).getViaje().getViaHoraSalida().substring(0, 2)) * 60 + Integer.parseInt(listaTemporal.get(i).getViaje().getViaHoraSalida().substring(3, 5));
//                    // System.out.println("horaMinViaje: " + horaminviaje + " horaminactual: " + horaminactual);
//////                    if (fechaviaje.equals(fechaactual)) {
//////                        if (horaminviaje >= horaminactual) {//muestro los viajes mayores a la hora actual(son los que aun faltan salir)
////////                            // System.out.println("horaMinViaje mayor o igual alaa horaminactual");
//////                            lista.add(listaTemporal.get(i));
//////                        }
//////                    } else {
//////                        lista.add(listaTemporal.get(i));
//////                    }
                    //mostramos las encomiendas del dia si queremos restringir por hora(para que no muestre si elviaje ya se paso de la hora actiual desmarcamos lo de arriba y quitams la linea de abajo)
//                    // System.out.println("estados: " + listaTemporal.get(i).getEncEstado());
                    //Que no se editen los Giros(Buscamos si en descripcion contiene a Giros; pues alli es donde se concatenan cuando registramos un giro o encomienda)
                    if (!listaTemporal.get(i).getEncDescripcion().contains("Giro")) {
                        lista.add(listaTemporal.get(i));
                    }
                    //fin que no se editen                    
                }
            }
        }
        return lista;
    }

    public void setLista(List<Encomienda> lista) {
        this.lista = lista;
    }

    public Tipocomprobante getObjetoTipoCompPago() {
        return objetoTipoCompPago;
    }

    public void setObjetoTipoCompPago(Tipocomprobante objetoTipoCompPago) {
        this.objetoTipoCompPago = objetoTipoCompPago;
    }

    public Viaje getObjetoViaje() {
        return ObjetoViaje;
    }

    public void setObjetoViaje(Viaje ObjetoViaje) {
        this.ObjetoViaje = ObjetoViaje;
    }

    public Encomienda getObjetoEmcomienda() {
        return ObjetoEmcomienda;
    }

    public Agencia getObjetoAgencia(int id) {
        return (Agencia) myobjeto.get(id);
    }

    public void setObjetoEmcomienda(Encomienda ObjetoEmcomienda) {
        this.ObjetoEmcomienda = ObjetoEmcomienda;
    }

    public Encomienda getObjetoEmcomiendaCrear() {
        return ObjetoEmcomiendaCrear;
    }

    public void setObjetoEmcomiendaCrear(Encomienda ObjetoEmcomiendaCrear) {
        this.ObjetoEmcomiendaCrear = ObjetoEmcomiendaCrear;
    }

    public Tipopago getObjetoTipoPago() {
        return objetoTipoPago;
    }

    public void setObjetoTipoPago(Tipopago objetoTipoPago) {
        this.objetoTipoPago = objetoTipoPago;
    }

    public List<Encomienda> getFiltrado() {
        return filtrado;
    }

    public void setFiltrado(List<Encomienda> filtrado) {
        this.filtrado = filtrado;
    }

    public List<Encomienda> getLista3() {
        return lista3;
    }

    public void setLista3(List<Encomienda> lista3) {
        this.lista3 = lista3;
    }

    public List<Encomienda> getLista4() {
        return lista4;
    }

    public void setLista4(List<Encomienda> lista4) {
        this.lista4 = lista4;
    }

    public List<Agencia> getLista5() {
        return lista5;
    }

    public void setLista5(List<Agencia> lista5) {
        this.lista5 = lista5;
    }

    public List<SelectItem> getObjetoItemsAgencia() {
        return objetoItemsAgencia;
    }

    public void setObjetoItemsAgencia(List<SelectItem> objetoItemsAgencia) {
        this.objetoItemsAgencia = objetoItemsAgencia;
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Encomienda Seleccionado", ((Encomienda) event.getObject()).getIdEncomienda().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Encomienda No seleccionado", ((Encomienda) event.getObject()).getIdEncomienda().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public Date getFechaactual() {
        return fechaactual;
    }

    public void setFechaactual(Date fechaactual) {
        this.fechaactual = fechaactual;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public List<Encomienda> getListaencoxentregar() {
        return listaencoxentregar;
    }

    public void setListaencoxentregar(List<Encomienda> listaencoxentregar) {
        this.listaencoxentregar = listaencoxentregar;
    }

    public String getBuscar() {
        return buscar;
    }

    public void setBuscar(String buscar) {
        this.buscar = buscar;
    }

    public String getBuscapor() {
        return buscapor;
    }

    public void setBuscapor(String buscapor) {
        this.buscapor = buscapor;
    }

    public int getIdagenciapdf() {
        return idagenciapdf;
    }

    public void setIdagenciapdf(int idagenciapdf) {
        this.idagenciapdf = idagenciapdf;
    }

    public Encomienda getObjetoEmcomiendaCrear2() {
        return ObjetoEmcomiendaCrear2;
    }

    public void setObjetoEmcomiendaCrear2(Encomienda ObjetoEmcomiendaCrear2) {
        this.ObjetoEmcomiendaCrear2 = ObjetoEmcomiendaCrear2;
    }

    public int getAnio1() {
        return anio1;
    }

    public void setAnio1(int anio1) {
        this.anio1 = anio1;
    }

    public int getAnio2() {
        return anio2;
    }

    public void setAnio2(int anio2) {
        this.anio2 = anio2;
    }

    public int getAnio3() {
        return anio3;
    }

    public Date getFechaini() {
        return fechaini;
    }

    public void setFechaini(Date fechaini) {
        this.fechaini = fechaini;
    }

    public Date getFechafin() {
        return fechafin;
    }

    public void setFechafin(Date fechafin) {
        this.fechafin = fechafin;
    }

    public void setAnio3(int anio3) {
        this.anio3 = anio3;
    }

    public void editar() {
        try {
            ObjetoEmcomienda.setEncPagaendest(Boolean.FALSE);
            if (ObjetoEmcomienda.getTipopago().getPagoNombre().equalsIgnoreCase("Credito")) {
                ObjetoEmcomienda.setEncPagado(Boolean.FALSE);
                ObjetoEmcomienda.setEncPagaendest(Boolean.FALSE);
            } else {
                if (!ObjetoEmcomienda.getEncPagado()) {
                    ObjetoEmcomienda.setEncPagaendest(Boolean.TRUE);//el estado pagae en destino es true
                }
            }
            encomiendaFacade.edit(ObjetoEmcomienda);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void editar2(ManagedBeanIniciosesion sesion) {
        try {
            if (ObjetoEmcomienda.getTipopago().getPagoNombre().equalsIgnoreCase("Contado")) {
                ObjetoEmcomienda.setEncPagado(Boolean.TRUE);
            } else {
                ObjetoEmcomienda.setEncPagado(Boolean.FALSE);
            }
            ObjetoEmcomienda.setEncEstado(0);
            encomiendaFacade.edit(ObjetoEmcomienda);

            //Hacer el Egreso de Caja x Entrega de Giro
            List<Encomiendadetalle> listadet = new LinkedList<Encomiendadetalle>();
            boolean giro = false;
            listadet = ObjetoEmcomienda.getEncomiendadetalleList();
            for (int i = listadet.size() - 1; i >= 0; i--) {
                if (listadet.get(i).getTipoencomienda().getEncTipo().equalsIgnoreCase("GIRO")) {
                    giro = true;
                    break;
                }
            }


            if (giro) {
//                Egresos objetoEgresosCrear11 = new Egresos();
                // 1 es efectivo
                Tipoegreso objetoTipoegreso = new Tipoegreso(1);

                objetoEgresosCrear11.setEgreEstado(true);
                objetoEgresosCrear11.setEgreFecha(new Date());
                objetoEgresosCrear11.setTipocomprobante(ObjetoEmcomienda.getTipocomprobante());
                objetoEgresosCrear11.setTipoegreso(objetoTipoegreso);
                objetoEgresosCrear11.setAgencia(sesion.getObjetoEmpleado().getAgencia());
                objetoEgresosCrear11.setEmpleado(sesion.getObjetoEmpleado());
                objetoEgresosCrear11.setIngEstadoEgreso(1);
                objetoEgresosCrear11.setEgreNroDocComp(ObjetoEmcomienda.getEncNroDocComp());
                objetoEgresosCrear11.setEgreDetalle("Por Entrega de Giro Nro.Comprobante: " + ObjetoEmcomienda.getEncNroDocComp());
                objetoEgresosCrear11.setEgreMonto(ObjetoEmcomienda.getEncTotal().multiply(BigDecimal.TEN));
                EgresosFacade.create(objetoEgresosCrear11);
                objetoEgresosCrear11 = new Egresos();
            }

            FacesMessage msg = new FacesMessage("Informacion: Trasaccion realizada con exito", "Trasaccion realizada con exito");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception e) {
            //System.out.println("yury" + "jojoj" + +e.getMessage()+"ja"+e.getCause());
            e.printStackTrace();
              FacesMessage msg = new FacesMessage("ERROR", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        
        }
    }

    public void eliminar() {
        try {
            ObjetoEmcomienda.setEncEstado(2);//2:Cancelada
            encomiendaFacade.edit(ObjetoEmcomienda);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void filtrarxViaje() {
        int idagencia = 0;
        lista3 = new LinkedList<Encomienda>();
        List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
        listaTemporal = encomiendaFacade.findAll();
        //para que llene nuevamente las agencias en el ccombo por cada viaje
        objetoItemsAgencia = new LinkedList<SelectItem>();
        Agencia q = new Agencia();
        q.setIdAgencia(0);
        myobjeto.put(q.getIdAgencia(), q);
        objetoItemsAgencia.add(new SelectItem(q, "Listar Encomiendas de Todas las Agencias"));
        String idagencAnt = "";//para ver que agencia estoy agregando a listar agencia x cada detalle.!
        //Finn
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getEncEstado() != 2 && listaTemporal.get(i).getViaje().equals(ObjetoEmcomienda.getViaje())) {
                //Que no se Listen los Giros(Buscamos si en descripcion contiene a Giros; pues alli es donde se concatenan cuando registramos un giro o encomienda)
                if (!listaTemporal.get(i).getEncDescripcion().contains("Giro")) {
                    lista3.add(listaTemporal.get(i));
                    //fin que no se editen
                    idagencia = listaTemporal.get(i).getAgencia().getIdAgencia();
                    if (!idagencAnt.contains("" + idagencia)) {//buscamos en la cadena si no lo contiene mando agregar la agencia.
                        listarAgencias(idagencia);
                    }
                    idagencAnt = idagencAnt + "" + idagencia;
                }
            }
        }
    }

    public void filtrarEncomiendasxviaje() {//Fucioin que permite filtros por viaje para poder postergar encomiendas()
        lista3 = new LinkedList<Encomienda>();
        List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
        listaTemporal = encomiendaFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (ObjetoEmcomiendaCrear.getViaje().getIdViaje() == 0) {//si es 0 no listams ninguna encomienda
                lista3 = new LinkedList<Encomienda>();
            } else {//Para postergar encomiendas solo listams las encomiendas que estan pendientes por enviar. estado=1
                if (listaTemporal.get(i).getEncEstado() == 1 && listaTemporal.get(i).getViaje().equals(ObjetoEmcomiendaCrear.getViaje())) {
                    //Que no se Listen los Giros(Buscamos si en descripcion contiene a Giros; pues alli es donde se concatenan cuando registramos un giro o encomienda)
                    if (!listaTemporal.get(i).getEncDescripcion().contains("Giro")) {
                        lista3.add(listaTemporal.get(i));
                    }
                    //fin que no se editen
                }
            }
        }
    }

    public void filtrarxAgencia() {
        lista3 = new LinkedList<Encomienda>();
        List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
        listaTemporal = encomiendaFacade.findAll();
        idagenciapdf = ObjetoEmcomienda.getAgencia().getIdAgencia();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (ObjetoEmcomienda.getAgencia().getIdAgencia() == 0) { //si es 0 es listar todas las encomiendas pertenecientes a ese viaje
                if (listaTemporal.get(i).getEncEstado() != 2 && listaTemporal.get(i).getViaje().equals(ObjetoEmcomienda.getViaje())) {
                    //Que no se Listen los Giros(Buscamos si en descripcion contiene a Giros; pues alli es donde se concatenan cuando registramos un giro o encomienda)
                    if (!listaTemporal.get(i).getEncDescripcion().contains("Giro")) {
                        lista3.add(listaTemporal.get(i));
                    }
                    //fin que no se editen
                }
            } else {
                if (listaTemporal.get(i).getEncEstado() != 2 && listaTemporal.get(i).getViaje().equals(ObjetoEmcomienda.getViaje()) && listaTemporal.get(i).getAgencia().equals(ObjetoEmcomienda.getAgencia())) {
                    //Que no se Listen los Giros(Buscamos si en descripcion contiene a Giros; pues alli es donde se concatenan cuando registramos un giro o encomienda)
                    if (!listaTemporal.get(i).getEncDescripcion().contains("Giro")) {
                        lista3.add(listaTemporal.get(i));
                    }
                    //fin que no se editen
                }
            }
        }
    }

    public void listarAgencias(int idagencia) {
        List<Agencia> listaagenc = new ArrayList<Agencia>();
        listaagenc = AgenciaFacade.findAll();
        for (Agencia p : listaagenc) {
            if (p.getAgenEstado() == true && idagencia == p.getIdAgencia()) {
                myobjeto.put(p.getIdAgencia(), p);
                objetoItemsAgencia.add(new SelectItem(p, p.getCiudad().getDepartamento().getDepDepartamento() + " " + p.getCiudad().getCiudCiudad() + " " + p.getAgenDireccion()));
            }
        }
    }

    public void postergaAdelantaEncom() {
        if (ObjetoEmcomiendaCrear2.getViaje().equals(ObjetoEmcomiendaCrear.getViaje())) {
            FacesMessage msg = new FacesMessage("Informacion", "Los viajes de postergaciones deben ser distintos");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return;
        }

        if (lista3.isEmpty()) {
            FacesMessage msg = new FacesMessage("Informacion", "No se puede Realizar la postergacion porque La Lista de Encomiendas esta Vacia");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return;
        } else {
            int aux = 0;
            for (int i = lista3.size() - 1; i >= 0; i--) {
//////                if (lista3.get(i).getEncEstado() == 1) {//Si hacemos cick sobre el boton de enviar e imprimir  por 2 da vez solo se imprimen mas no cambian su estado(esto puesto que se pueden hacer click en el boton dsps de enviarlas y quisas ya fueron entregadas algunas encomiendas y si hacemos click dsps d ese evento cambiara a Por Recoger k es el estado a pesar que ya estan recogidas ks el estado 0)
//////                    lista3.get(i).setEncEstado(3);//3:Enviadas
//////                }
                lista3.get(i).setViaje(ObjetoEmcomiendaCrear2.getViaje());
                ObjetoEmcomienda = lista3.get(i);
                try {
                    encomiendaFacade.edit(ObjetoEmcomienda);
                    aux = 1;
//////                    if (lista3.get(i).getEncEstado() == 3) {//Solo actualizams(wnviados->estado 3) cuando tiene estado 3 que son las que se acaban de enviar.En este caso Solo imprimimos
//////                        encomiendaFacade.edit(ObjetoEmcomienda);
//////                    }
//////                    generar_listaencomiendasPDF();
//////                    banderashowdilogprint = 1;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (aux == 1) {
                lista3 = new LinkedList<Encomienda>();//supuestamente la lista3 ya esta vacia porque se postergaron las encomiedas
                FacesMessage msg = new FacesMessage("Informacion", "La Trasaccion se realizó con Exito.!");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Se produjeron errores al postergar la encomienda");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        }

    }

    public void enviarimprimir() {
//        // System.out.println("idAgenciaaaaa: "+ObjetoEmcomienda.getAgencia().getIdAgencia());
        if (lista3.isEmpty()) {
            FacesMessage msg = new FacesMessage("Informacion", "La Lista esta Vacia");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            for (int i = lista3.size() - 1; i >= 0; i--) {
                if (lista3.get(i).getEncEstado() == 1) {//Si hacemos cick sobre el boton de enviar e imprimir  por 2 da vez solo se imprimen mas no cambian su estado(esto puesto que se pueden hacer click en el boton dsps de enviarlas y quisas ya fueron entregadas algunas encomiendas y si hacemos click dsps d ese evento cambiara a Por Recoger k es el estado a pesar que ya estan recogidas ks el estado 0)
                    lista3.get(i).setEncEstado(3);//3:Enviadas
                }
                ObjetoEmcomienda = lista3.get(i);
                try {
                    if (lista3.get(i).getEncEstado() == 3) {//Solo actualizams(wnviados->estado 3) cuando tiene estado 3 que son las que se acaban de enviar.En este caso Solo imprimimos
                        encomiendaFacade.edit(ObjetoEmcomienda);
                    }
//                    generar_listaencomiendasPDF();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            generar_listaencomiendasPDF();
        }

    }

    public void filtroAvanzadoencoxentregar(ManagedBeanIniciosesion sesion) throws ParseException {
        String comparacion = "";
        Date fecha1 = formatearFechaDate(fechaactual);
        Date fechaact2 = formatearFechaDate(fecha2);
        Date fechaenco;
        if (fecha1.after(fechaact2)) {
            FacesMessage msg = new FacesMessage("Informacion", "La fecha Final debe ser mayor a la Fecha Inicial");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return;
        }
        //Si es un Vendedor que no aparezca habilitado el combo para elegir la agencia
        //solo busca encomiendas de su agencia.
        //antes -> listaTemporal.get(i).getAgencia1().equals(ObjetoAgencia)
        int idagencia = 0;
        if (sesion.getObjetoEmpleado().getCargo().getCarCargo().equalsIgnoreCase("ADMINISTRADOR")) {
            idagencia = ObjetoAgencia.getIdAgencia();//id del combo
            // System.out.println("ADMIN "+idagencia);
        } else if (sesion.getObjetoEmpleado().getCargo().getCarCargo().equalsIgnoreCase("VENDEDOR")) {
            idagencia = sesion.getObjetoEmpleado().getAgencia().getIdAgencia();//id de la agencia a la que pertenece.
            // System.out.println("vendedor "+idagencia);
        }

        buscar = buscar.trim().toLowerCase();
        if (buscapor.equalsIgnoreCase("destinatario")) {//buscar por destinatario
            listaencoxentregar = new LinkedList<Encomienda>();
            List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
            listaTemporal = encomiendaFacade.findAll();
            for (int i = listaTemporal.size() - 1; i >= 0; i--) {//filtro las recogidas(0) y por recoger(3)
                fechaenco = formatearFechaDate(listaTemporal.get(i).getEncFecha());
                if ((listaTemporal.get(i).getEncEstado() == 3 || listaTemporal.get(i).getEncEstado() == 0) && listaTemporal.get(i).getAgencia1().getIdAgencia() == idagencia && ((fechaenco.after(fecha1) || fechaenco.equals(fecha1)) && (fechaenco.before(fechaact2) || fechaenco.equals(fechaact2)))) {
                    comparacion = listaTemporal.get(i).getCliente1().getCliRUC() + " " + listaTemporal.get(i).getCliente1().getCliRazSoc() + " " + " " + listaTemporal.get(i).getCliente1().getPersona().getPerDNI() + listaTemporal.get(i).getCliente1().getPersona().getPerApellidos() + " " + listaTemporal.get(i).getCliente1().getPersona().getPerNombres();
                    if (comparacion.toLowerCase().contains(buscar)) {
                        listaencoxentregar.add(listaTemporal.get(i));
                    }
                }
            }
        } else if (buscapor.equalsIgnoreCase("remitente")) {
            listaencoxentregar = new LinkedList<Encomienda>();
            List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
            listaTemporal = encomiendaFacade.findAll();
            for (int i = listaTemporal.size() - 1; i >= 0; i--) {//filtro las recogidas(0) y por recoger(3)
                if ((listaTemporal.get(i).getEncEstado() == 3 || listaTemporal.get(i).getEncEstado() == 0) && listaTemporal.get(i).getAgencia1().getIdAgencia() == idagencia && ((listaTemporal.get(i).getEncFecha().after(fecha1) || listaTemporal.get(i).getEncFecha().equals(fecha1)) && (listaTemporal.get(i).getEncFecha().before(fechaact2) || listaTemporal.get(i).getEncFecha().equals(fechaact2)))) {
                    comparacion = listaTemporal.get(i).getCliente().getCliRUC() + " " + listaTemporal.get(i).getCliente().getCliRazSoc() + " " + listaTemporal.get(i).getCliente1().getPersona().getPerDNI() + listaTemporal.get(i).getCliente().getPersona().getPerApellidos() + " " + listaTemporal.get(i).getCliente().getPersona().getPerNombres();
                    if (comparacion.toLowerCase().contains(buscar)) {
                        listaencoxentregar.add(listaTemporal.get(i));
                    }
                }
            }
        } else {//buscar por Agencia de Envio
            listaencoxentregar = new LinkedList<Encomienda>();
            List<Encomienda> listaTemporal = new LinkedList<Encomienda>();
            listaTemporal = encomiendaFacade.findAll();
            for (int i = listaTemporal.size() - 1; i >= 0; i--) {//filtro las recogidas(0) y por recoger(3)
                if ((listaTemporal.get(i).getEncEstado() == 3 || listaTemporal.get(i).getEncEstado() == 0) && listaTemporal.get(i).getAgencia1().getIdAgencia() == idagencia && ((listaTemporal.get(i).getEncFecha().after(fecha1) || listaTemporal.get(i).getEncFecha().equals(fecha1)) && (listaTemporal.get(i).getEncFecha().before(fechaact2) || listaTemporal.get(i).getEncFecha().equals(fechaact2)))) {
                    comparacion = listaTemporal.get(i).getAgencia().getCiudad().getDepartamento().getDepDepartamento() + " " + listaTemporal.get(i).getAgencia().getCiudad().getCiudCiudad() + " " + listaTemporal.get(i).getAgencia().getAgenDireccion();
                    if (comparacion.toLowerCase().contains(buscar)) {
                        listaencoxentregar.add(listaTemporal.get(i));
                    }
                }
            }
        }
    }

    public String formatearFecha(Date fecha) {
        String fechaformateada = "";
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaformateada = (df.format(fecha));
        return fechaformateada;
    }

    public Date formatearFechaDate(Date fecha) throws ParseException {//me devuelve la fecha actual sin minutos y segundos
        String fechaformateada = "";
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaformateada = (df.format(fecha));
        Date fecha1 = df.parse(fechaformateada);
        return fecha1;
    }

    public void generar_listaencomiendasPDF() {
        // System.out.println(ObjetoEmcomienda);
        Rectangle pagesize = new Rectangle(428f, 573f);
        Document document = new Document(pagesize, 10f, 10f, 10f, 10f);

        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        FileWriter fichero = null;
        PrintWriter pw = null;
        String fechasalida = formatearFecha(ObjetoEmcomienda.getViaje().getViaFehaSalida());
        String origen = ObjetoEmcomienda.getViaje().getRuta().getCiudad().getCiudCiudad();
        String destino = ObjetoEmcomienda.getViaje().getRuta().getCiudad1().getCiudCiudad();
        String oficinaorigen = ObjetoEmcomienda.getAgencia().getAgenDireccion();
        String chofer = ObjetoEmcomienda.getViaje().getEmpleado1().getPersona().getPerNombres() + " " + ObjetoEmcomienda.getViaje().getEmpleado1().getPersona().getPerApellidos();
        String oficinadestino = ObjetoEmcomienda.getAgencia1().getAgenDireccion();
        int idviaje = ObjetoEmcomienda.getViaje().getIdViaje();
        // System.out.println("idviaje: " + idviaje);

        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(extContext.getRealPath("//Encomiendas//boletas//listaencomiendas" + idviaje + "" + idagenciapdf + ".pdf")));
            document.addAuthor("Leon Leyva Leyxer Alexander");
            document.addCreationDate();
            document.addCreator("iText library");
            document.addTitle("Lista de Giros y Encomiendas");

            document.open();
            writer.addJavaScript("this.print(true);", false);//Automaticamente abre el cuadro para imprimir
            String cuadrolargo = "                                                        ";
            origen = origen + cuadrolargo;
            destino = destino + cuadrolargo;
            oficinaorigen = oficinaorigen + cuadrolargo;
            chofer = chofer + cuadrolargo;
            oficinadestino = oficinadestino + cuadrolargo;


            this.absText(fechasalida, 88, 477, writer);
            this.absText(origen.substring(0, 40), 212, 477, writer);
            this.absText(destino.substring(0, 40), 335, 480, writer);

            int renglon = 438;
            DecimalFormat df = new DecimalFormat("0.00");
            String remitente = "";
            double total = 0;
            for (int i = 0; i < lista3.size(); i++) {
                if (lista3.get(i).getCliente1().getCliRUC().equalsIgnoreCase("--")) {//Natural
                    remitente = lista3.get(i).getCliente1().getPersona().getPerNombres() + " " + lista3.get(i).getCliente1().getPersona().getPerApellidos();
                } else {//juridico
                    remitente = lista3.get(i).getCliente1().getCliRazSoc() + " " + " RUC: " + lista3.get(i).getCliente1().getCliRUC();
                }
                double precio = lista3.get(i).getEncTotal().byteValue();
                String desc = lista3.get(i).getEncDescripcion() + cuadrolargo;
                total = total + precio;
                this.absText(lista3.get(i).getEncNroDocComp(), 8, renglon, writer);
                this.absText(remitente, 82, renglon, writer);
                this.absText(desc.substring(0, 8), 290, renglon, writer);
                this.absText("" + df.format(precio), 348, renglon, writer);
                this.absText("-", 398, renglon, writer);
                renglon = renglon - 17;
                if (i == 26) {
                    break;
                }//Si hay mas de 27 encomiendas descuadra el Papel :(:(:(:(->Quitar este numero si desea imprimir todas
            }

            this.absText("" + df.format(total), 348, 22, writer);

            this.absText(oficinaorigen, 18, 11, writer);
            this.absText(chofer.substring(0, 40), 135, 11, writer);
            this.absText(oficinadestino.substring(0, 40), 270, 11, writer);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fichero) {
                    fichero.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        document.close();
    }

    private static void absText(String text, int x, int y, PdfWriter writer) {
        try {
            PdfContentByte cb = writer.getDirectContent();
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.saveState();
            cb.beginText();
            cb.moveText(x, y);
            cb.setFontAndSize(bf, 10);
            cb.showText(text);
            cb.endText();
            cb.restoreState();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void mostrarReporte1() {
        RequestContext context = RequestContext.getCurrentInstance();
        if (anio1 > anio2) {
            FacesMessage msg = new FacesMessage("Informacion", "El Año Inicial debe ser menor que el Año Final");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.addCallbackParam("mostrar", 0);


        } else if (anio1 == 0 || anio2 == 0) {
            FacesMessage msg = new FacesMessage("Informacion", "Ingrese El año Inicial y el Año Final");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.addCallbackParam("mostrar", 0);

        } else {
            context.addCallbackParam("anio1", anio1);
            context.addCallbackParam("anio2", anio2);
            context.addCallbackParam("mostrar", 1);
        }
    }

    public void mostrarReporte2() {
        RequestContext context = RequestContext.getCurrentInstance();
        if (anio3 == 0) {
            FacesMessage msg = new FacesMessage("Informacion", "Ingrese el año");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.addCallbackParam("mostrar", 0);

        } else {
            context.addCallbackParam("anio3", anio3);
            context.addCallbackParam("mostrar", 1);
        }
    }

    public void mostrarReporte3() {
        RequestContext context = RequestContext.getCurrentInstance();
        if (fechaini.after(fechafin)) {
            FacesMessage msg = new FacesMessage("Informacion", "La Fecha Inicial debe ser menor que la Fecha Final");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.addCallbackParam("mostrar", 0);
        } else {
            context.addCallbackParam("fecha1", formatearFecha(fechaini));
            context.addCallbackParam("fecha2", formatearFecha(fechafin));
            context.addCallbackParam("mostrar", 1);
        }
    }
}